package pruebaciudad;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Random;
import javax.swing.Timer;
import pruebaciudad.formas.Imagen;
import pruebaciudad.formas.Punto;

public class AutitoMovedo extends Timer implements ActionListener {
    private Imagen autito;
    {
        try {
            autito = new Imagen("carro.png", new Punto(-50, -50), 45, 45);
            autito.setMostrarPuntos(false);
            autito.setMostrarCentro(false);
        } catch (IOException e){
            e.printStackTrace();
        }
    }
    
    public AutitoMovedo (){
        super(500, null);
        addActionListener(this);
        setDelay(10);
    }
    
    public Imagen getImagenDeAutito(){
        return autito;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        int [] pos = calcularNuevaPosicion();
        autito.desplazar(pos[0], pos[1]);
    }

    private static Random ALEATORIO =  new Random();
    private final static int ARRIBA = 0, DERECHA = 1, ABAJO = 2, IZQUIERDA = 3;
    private int orientacion = ALEATORIO.nextInt(4);
    private int PASO = 1;
    private int[] calcularNuevaPosicion() {
        Punto centro = autito.getCentro();
        
        if (isEquina(centro)){
            System.out.println("Esquina");
            orientacion = getNuevaOrientación();
        }
        
        
        int[] avance = new int[2];
        switch (orientacion){
            case ARRIBA:
                avance[1] = PASO;
                break;
            case DERECHA:
                avance[0] = PASO;
                break;
            case ABAJO: 
                avance[1] = -PASO;
                break;
            case IZQUIERDA:
                avance[0] = -PASO;
        }
        
        return avance;
    }

    private boolean isEquina(Punto centro) {
        double menor_x = Double.MAX_VALUE, menor_y = Double.MAX_VALUE;
        System.out.println((60 * Math.sin(Math.PI / 4.0)));
        System.out.println((130 - (60 * Math.sin(Math.PI / 4.0)) * 2) / 2);
        if (orientacion == IZQUIERDA || orientacion == DERECHA){
            for (int i = -2; i <= 3; i++){
                double x = -50 + i * 2 * (60 * Math.sin(Math.PI / 4.0)) + (130 - (60 * Math.sin(Math.PI / 4.0)) * 2) / 2;
                // Coord del mas cercano  <-------- A ---------------->    <-------------------------b------------->        

                if (Math.abs(centro.getX() - x) < menor_x){
                    menor_x = Math.abs(centro.getX() - x);
                }
            }
            return Math.abs(menor_x) < 1;
        }
        
        if (orientacion == ARRIBA || orientacion == ABAJO){
            for (int i = 0; i <= 5; i++){
                double y = 350 - i * 2 * (60 * Math.sin(Math.PI / 4.0)) - (130 + (60 * Math.sin(Math.PI / 4.0)) * 2) / 2;
                // Coord del mas cercano  <-------- A ---------------->    <-------------------------b------------->        

                if (Math.abs(centro.getX() - y) < menor_y){
                    menor_y = Math.abs(centro.getY() - y);
                }
            }
            
            return Math.abs(menor_y) < 1;
        }
        
//        System.out.format("Xmin = %f, Ymin = %f HIPOT = %f\n", menor_x, menor_y, Math.abs(menor_y * menor_y + menor_x * menor_x));
//        return Math.abs(menor_y * menor_y + menor_x * menor_x) < 15;
        //El 15 es el radio que establecimos para las esquinas
        return false;
    }

    private int getNuevaOrientación() {
        int new_dir = ALEATORIO.nextInt(4);
        
        while (new_dir == orientacion){
            new_dir = ALEATORIO.nextInt(4);
        }
        
        return new_dir;
    }
    
}
